package cxy.highConcurrency;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureDemo {
	
	public static void main(String[] args) {
//		// 任务1：洗水壶->烧开水
//		CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> {
//			System.out.println("T1:洗水壶...");
//			sleep(1, TimeUnit.SECONDS);
//
//			System.out.println("T1:烧开水...");
//			sleep(15, TimeUnit.SECONDS);
//		});
		
		CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
			System.out.println("T1:洗水壶...");
			sleep(1, TimeUnit.SECONDS);

			System.out.println("T1:烧开水...");
			sleep(10, TimeUnit.SECONDS);
			
			return "fsds";
		});

		// 任务2：洗茶壶->洗茶杯->拿茶叶
		CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
			System.out.println("T2:洗茶壶...");
			sleep(1, TimeUnit.SECONDS);

			System.out.println("T2:洗茶杯...");
			sleep(2, TimeUnit.SECONDS);

			System.out.println("T2:拿茶叶...");
			sleep(1, TimeUnit.SECONDS);
			return "龙井";
		});
		
		//任务3：任务1和任务2完成后执行：泡茶    用下划线 __ 表示不用的参数  t1:f1的返回值，tf:f2的返回值
		CompletableFuture<String> f3 = f1.thenCombine(f2, (t1, tf)->{
			//CompletableFuture<String> f3 = f1.thenCombine(f2, (__, tf)->{
			
			System.out.println("t1:" + tf);
		    System.out.println("T1:拿到茶叶:" + tf);
		    System.out.println("T1:泡茶...");
		    return "上茶:" + tf;
		  });
		
		//等待任务3执行结果
		System.out.println(f3.join());
	}

	static void sleep(int t, TimeUnit u) {
		try {
			u.sleep(t);
		} catch (InterruptedException e) {
		}
	}

}
